home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / os2 / pmnos11s / lpdperm.c < prev    next >
C/C++ Source or Header  |  1993-07-30  |  4KB  |  175 lines

  1. /* Internet LPD Server printer permissions check
  2.  *   written by David Johnson (dave@cs.olemiss.edu)
  3.  *   portions of code extracted from PLP.
  4.  *
  5.  * This code is in the public domain.
  6.  *
  7.  * Revision History:
  8.  *
  9.  * Revision 1.1  91/09/27  dave (from Hans-Juergen)
  10.  * Changed definition of D_PERMISSION to Lpdpermission
  11.  *
  12.  * Revision 1.0  91/09/04  dave
  13.  * Initial Release
  14.  *
  15.  */
  16. #include <stdio.h>
  17. #include <fcntl.h>
  18. #include <ctype.h>
  19. #include <time.h>
  20. #include <sys/stat.h>
  21. #ifdef    __TURBOC__
  22. #include <io.h>
  23. #include <dir.h>
  24. #endif
  25. #include "global.h"
  26. #include "mbuf.h"
  27. #include "proc.h"
  28. #include "iface.h"
  29. #include "socket.h"
  30. #include "dirutil.h"
  31. #include "commands.h"
  32. #include "files.h"
  33. #include "lp.h"
  34. #include "lpd.h"
  35.  
  36. /* local functions - exported to lpd.c */
  37.        int  check_permission __ARGS((char *host, char *user, char *queue, int *priority));
  38.  
  39. /* local functions - private */
  40. static int  matches __ARGS((char *string, char *pattern));
  41.  
  42. /*
  43.  * Check specified parameters against permissions file
  44.  *
  45.  * Algorithm design ideas borrowed from PLP
  46.  */
  47. check_permission( host, user, queue, priority )
  48. char *host, *user, *queue;
  49. int *priority;
  50. {
  51.     char f_host[64], f_user[32], f_queue[32], f_priority[2];
  52.     char buffer[256], *cp;
  53.     int permission = 0, done = 0, i;
  54.     int negate, tilde;
  55.     FILE *fp;
  56.  
  57. #ifdef LPD_DEBUG
  58.     tprintf( "check_permission( %s, %s, %s, %c ) ",
  59.                 host, user, queue, *priority );
  60.     tflush();
  61. #endif
  62.  
  63.     if( (fp = fopen( Lpdpermission, "r" )) == NULL )
  64.         return -1;
  65.     while( !done && fgets( buffer, sizeof( buffer ), fp ) != NULL ) {
  66.         if( buffer[0] == '#' || buffer[0] == '\n' )
  67.             continue;
  68.         tilde = negate = 0;
  69.         cp = buffer;
  70.         if( *cp == '~' ) {
  71.             cp++;
  72.             tilde = 1;
  73.         }
  74.         if( *cp == '!' ) {
  75.             cp++;
  76.             negate = 1;
  77.         }
  78.         i = sscanf( cp, "%s%s%s%s", f_host, f_user, f_queue,
  79.                         f_priority );
  80.         if( i == 0 )
  81.             continue;
  82.         if( i < 4 ) {
  83.             /* display error message */
  84.             return( permission );
  85.         }
  86.  
  87.         if( !matches( host, f_host ) ) {    /* failed */
  88.             if( tilde )
  89.                 done = 1;
  90.             continue;
  91.         }
  92.  
  93.         if( !matches( user, f_user ) ) {
  94.             if( tilde )
  95.                 done = 1;
  96.             continue;
  97.         }
  98.  
  99.         if( !matches( queue, f_queue ) ) {
  100.             if( tilde )
  101.                 done = 1;
  102.             continue;
  103.         }
  104.  
  105.         /*
  106.          * parameters matched this line. However, if a tilde is
  107.          * present, this line is only for filtering and the
  108.          * paramaters must also match another. Continue looking.
  109.          */
  110.         if( tilde )
  111.             continue;
  112.  
  113.         /*
  114.          * Now a match was really found. Check priority.
  115.          */
  116.         if( priority && *f_priority && *f_priority != '*' )
  117.             if( *priority < *f_priority )    /* too high */
  118.                 *priority = *f_priority;
  119.  
  120.         done = permission = 1;
  121.         if( negate )
  122.             permission = 0;
  123.         /*
  124.          * Will fall out of loop (done = 1)
  125.          */
  126.     }
  127.     fclose( fp );
  128.  
  129. #ifdef LPD_DEBUG
  130.     tprintf( "= %d(%c)\n", permission, *priority );
  131.     tflush();
  132. #endif
  133.     return( permission );
  134. }
  135.  
  136. /*
  137.  * Compare a specified string against a (possible) wildcard string
  138.  *
  139.  * Algorithm borrowed from PLP
  140.  */
  141. int
  142. matches( string, pattern )
  143. char *string, *pattern;
  144. {
  145.     int c;
  146.  
  147.     if( string == NULL || pattern == NULL )
  148.         return 1;
  149.  
  150.     while( (c = *pattern) != NULL ) {
  151.         switch( c ){
  152.             /*
  153.              * match 0 or more characters in the string
  154.              */
  155.             case '*':
  156.                 if( matches( string, pattern+1 ) )
  157.                     return 1;
  158.                 if( *string && matches( string+1, pattern ) )
  159.                     return 1;
  160.                 return 0;
  161.             case '?':
  162.                 if( *string == NULL )
  163.                     return 0;
  164.                 break;
  165.             default:
  166.                 if( c != *string )
  167.                     return 0;
  168.                 break;
  169.         }
  170.         ++string;
  171.         ++pattern;
  172.     }
  173.     return( *pattern == *string );
  174. }
  175.